import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { getUserInfo } from '../api/auth'
import router from '../router'

// 用户信息接口
export interface UserInfo {
  id: number
  username: string
  realName?: string
  email?: string
  phoneNumber?: string
  role: string
  lastLoginTime?: string
}

export const useUserStore = defineStore('user', () => {
  // 状态
  const token = ref<string | null>(localStorage.getItem('token'))
  const userInfo = ref<UserInfo | null>(null)
  const loading = ref(false)

  // getters
  const isLoggedIn = computed(() => !!token.value)
  const isAdmin = computed(() => userInfo.value?.role === 'Admin')

  // actions
  // 设置token
  function setToken(newToken: string) {
    token.value = newToken
    localStorage.setItem('token', newToken)
  }

  // 清除token
  function clearToken() {
    token.value = null
    localStorage.removeItem('token')
  }

  // 初始化用户状态
  async function init() {
    if (token.value) {
      return await fetchUserInfo()
    }
    return null
  }

  // 获取当前用户信息
  async function fetchUserInfo() {
    if (!token.value) return null

    try {
      loading.value = true
      const res = await getUserInfo()
      
      // 支持不同的成功状态码
      if ((res.code === 0 || res.code === 'Success' || res.code === 200) && res.data) {
        userInfo.value = res.data
        return res.data
      } else {
        console.error('获取用户信息响应无效:', res)
        // 如果获取用户信息失败，可能是token已过期
        clearToken()
        router.push('/login')
        return null
      }
    } catch (error) {
      console.error('获取用户信息失败:', error)
      // 获取用户信息失败时清空token并跳转到登录页
      clearToken()
      if (router.currentRoute.value.meta.requiresAuth) {
        router.push('/login')
      }
      return null
    } finally {
      loading.value = false
    }
  }

  // 登出
  function logout() {
    userInfo.value = null
    clearToken()
    router.push('/login')
  }

  return {
    token,
    userInfo,
    loading,
    isLoggedIn,
    isAdmin,
    setToken,
    clearToken,
    init,
    fetchUserInfo,
    logout
  }
}) 